[SpringBoot] エクスポートしたjarファイルをEC2で実行する 〜非公開のS3にアクセス〜
はじめに
前回はS3のバケットが公開されている状態でS3のオブジェクトを取得しましたが
扱うファイルが公開されているとは限らないので、S3のファイルは認証済みユーザーのみに公開されている想定でやってみます。
EC2にエクスポートしたjarファイルがアップロードされている前提なので、アップロードする手順については前回の記事をご覧ください。
環境
Spring Tool Suite 3.8.0
コード
コードは前回と同じものを使用します。詳細については前回の記事を参照していただければと思います。
@SpringBootApplication @EnableScheduling public class BlogProjectApplication { public static void main(String[] args) { SpringApplication.run(BlogProjectApplication.class, args); } }
@Service public class ScheduledService { @Autowired GetS3Object getS3Object; @Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo") public void fixedRate(){ getS3Object.showS3Object(); } }
@Component public class GetS3Object { public void showS3Object(){ AmazonS3 amazonS3 = new AmazonS3Client(); S3Object s3Object = amazonS3.getObject("BUCKET_NAME", "FILENAME"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s3Object.getObjectContent())); StringBuilder stringBuilder = new StringBuilder(); String line; try { while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } } catch (IOException e) { e.printStackTrace(); } System.out.println(stringBuilder.toString()); } }
buildscript { ext { springBootVersion = '1.4.0.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'spring-boot' jar { baseName = 'BlogProject' } sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile 'com.amazonaws:aws-java-sdk:+' compile('org.springframework.boot:spring-boot-starter') testCompile('org.springframework.boot:spring-boot-starter-test') } eclipse { classpath { containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER') containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8' } }
作業内容
- S3のバケットのアクセス許可を認証済みユーザーとしている
-
IAMでS3にアクセスできるユーザーを作成する
-
credentialsは環境変数に設定する
実践
S3のファイルのアクセス許可の確認方法は
マネジメントコンソールのバケットorファイルを指定してプロパティ→アクセス許可で指定できます。
次にIAMでS3にアクセスできるユーザーを作成します。 マネジメントコンソールでIAMを選択し
ユーザー → 新規ユーザーの作成 → ユーザー名を入力後作成ボタン押下 → 認証情報のダウンロード
これでユーザーが作成できましたので、このユーザーにポリシーをアタッチします。(今回はFullAccessとしました) 認証情報(credentials)を発行したら環境変数に設定します
$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx $ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx
環境変数にセットされているかどうかは
$ env
で確認できます。
環境変数にセットされていれば
AmazonS3 amazonS3 = new AmazonS3Client();
上記コードGetS3Object.javaの6行目で環境変数からcredentialsを取得しているのでS3にアクセスすることができます。
(EC2上で実行するのでInstanceProfileCredentialsProviderを使えばいいのかもしれませんが、手元のマシンでも都度確認したいので環境変数としています。)
なぜこれでcredentialsを取得できているんだ!!と思われた方は以下のサイトを参考にしてもらえれば詳細な説明があります。
java -jar BlogProject.jar
とコマンドを打てばEC2上で実行したプロジェクトでアクセス制限されているS3のリソースにアクセスすることができます。
最後に
次はRedshiftにCOPYコマンドを送ってS3のファイルをLoadしてみようと思います。